/**
 * 管理员模块
 */
import { login, logout, authInfo } from 'api/admin.js'
import to from 'await-to-js'
import { Message } from 'element-ui'
import router from 'router'
import Layout from 'layouts'
export default {
  namespaced: true,
  state: {
    admin: {
      account: '',   //账号
      realname: '',  //昵称
      _id: '',       //管理员id
      token: '',     //令牌
      role: {},      //当前管理员的角色信息
      functions: [], //当前管理员的权限列表
      routeList: []  //动态加载的路由表
    }
  },
  getters: {
    getRealName(state) {
      return state.admin.realname;
    },
    getToken(state) {
      return state.admin.token;
    },
    getAccount(state) {
      return state.admin.account;
    }
  },
  mutations: {
    setToken(state, token) {
      state.admin.token = token;
    },
    setAccount(state, account) {
      state.admin.account = account;
    },
    setId(state, _id) {
      state.admin._id = _id;
    },
    setRealname(state, realname) {
      state.admin.realname = realname;
    },
    setRole(state, role) {
      state.admin.role = role;
    },
    setFunctions(state, functions) {
      state.admin.functions = functions;
    },
    setRouteList(state, routeList) {
      state.admin.routeList = routeList;
    }
  },
  actions: {
    async login(context, user) {
      //在这里调用api/admin.js里的函数发起ajax请求
      let [error, res] = await to(login(user))
      if (res) {
        Message.success(res.msg)
        //将token、账号、id 都保存到vuex中
        context.commit('setToken', res.token)
        context.commit('setAccount', user.account)
        context.commit('setId', res._id)
        //查询当前登陆者的权限信息
        context.dispatch('auth', res._id)
        //跳转到首页
        router.replace('/')
      } else {
        Message.error(error)
      }
    },
    async logout(context) {
      let [error, res] = await to(logout())
      if (res) {
        //清除本地token和account
        context.commit('setToken', '')
        context.commit('setAccount', '')
        //回登录页面
        router.replace('/login')
      } else {
        Message.error(error)
      }
    },
    //获取权限
    async auth(context, _id) {
      let [error, res] = await to(authInfo(_id))
      //把管理员的真实姓名保存到vuex中
      context.commit('setRealname', res.adminInfo.realname)
      //把管理员的角色和权限列表都保存到vuex中
      context.commit('setRole', res.roles)
      context.commit('setFunctions', res.functions)
      context.dispatch('addRoute', res.functions)
    },
    //添加路由信息
    addRoute(context, functions) {
      //遍历functions，添加到路由中
      //对菜单数据进行分组：把二级菜单放到一级菜单的对象里面
      let menu1 = [];//放一级菜单
      let menu2 = [];//放二级菜单
      functions.forEach(m => {
        //type为1表示菜单，不是1则不是菜单，不需要创建路由
        if (m.type == 1) {
          if (m.parentId == 0) {
            menu1.push({
              path: m.path,
              meta: {
                icon: m.icon,
                title: m.name
              },
              component: Layout
            });
          } else {
            //通过path找到对应的Vue文件名，这里要求path必须和文件名保持一致
            //path纯小写，文件名首字母大写
            let f1 = m.path.substring(1, 2).toUpperCase();
            let f2 = m.path.substring(2)
            menu2.push({
              path: '',
              parent:m.path,
              component: () => import(`pages/${f1}${f2}.vue`),
              meta: {
                title: m.name
              }
            });
          }
        }
      })

      //遍历二级菜单
      menu2.forEach(m => {
        //找到当前二级菜单对应的一级菜单对象
        let level1 = menu1.find(s => s.path == m.parent)
        //如果找到了自己的父菜单，就将自己添加到父菜单的children数组中
        if (level1) {
          if (level1.children) {
            level1.children.push(m);  //如果children存在,则push
          } else {
            level1['children'] = [m];//如果children不存在,则初始化一个
          }
        }
      })
      // 将组装好的路由数组添加到全局的router对象中
      router.addRoutes(menu1);
      //将组装好的路由列表保存到vuex中
      context.commit('setRouteList', menu1);
      console.log(router);
    }
  }
}